Android  지문 인식 개발 사례

13978 단어 Android지문 인식
안 드 로 이 드 M 지문 은 자료 가 너무 적어 한동안 원생 안 드 로 이 드 코드 를 읽 고 다음 과 같은 예 를 들 어 도움 이 필요 한 사람 에 게 기여 했다.
다음 내용 은 64 비트 의 하 이 패스 CPU 를 기반 으로 fpc 1020 칩 을 탑재 하고 있 으 며,이 부분 코드 는 원생 안 드 로 이 드 에서 공장 지문 테스트 에 대비 하여 변경 되 었 습 니 다.원생 안 드 로 이 드 지문 입력 은 10 번 채취 해 야 합 니 다.
코드 설명:
1.FingerPrintEnrollBase 클래스:
중요 한 것 은
자바 코드

public interface Listener { 
  void onEnrollmentHelp(CharSequence helpString); 
  void onEnrollmentError(int errMsgId, CharSequence errString); 
  void onEnrollmentProgressChange(int steps, int remaining); 
} 
이 인터페이스.
1)onEnrollment Help 함수:아래쪽 에서 되 돌아 오 는 지문 조작 도움말 정보 입 니 다.
2)onEnrollment Error 함 수 는 하층부 에서 되 돌아 오 는 오류 정보 입 니 다.errMsgId 는 오류 정보 형식 입 니 다.그 중에서 1 은 지문 하드웨어 가 사용 할 수 없 음 을 나타 내 고 3 은 시간 초과,5 는 작업 이 취소 되 었 음 을 나타 냅 니 다.errString 은 errmsgid 에 대응 하 는 문자 정보 로 필요 한 자신의 실험 이 있 으 면 알 수 있 습 니 다.
3)onEnrollment ProgressChange()함 수 는 현재 지문 의 채집 상황 을 표시 합 니 다.steps:총 몇 번 입력 해 야 합 니까?remaining 은 몇 번 남 았 습 니까?저 는 이 함수 에서 Log 를 인쇄 합 니 다.
2.FingerPrintActivity 는 주 Activity 류 이 고 FingerPrintEnrollBase 는 지문 Base 류 입 니 다.
특별한 설명 이 필요 한 것 은 FingerPrintEnrollBase 클래스 에 private byte[]mToken=new byte[69]가 있 습 니 다.이 배열 의 정상 적 인 상황 은 비밀 번 호 를 입력 한 후에 framework 층 을 통 해 hal 층 에 신청 한 것 입 니 다.저 는 그 코드 를 검증 하지 않 기 위해 sizeof(hwauth_token_t)계 산 된 것 은 69 이 므 로 필요 한 것 은 이에 따라 계산 하 십시오.나 는 코드 에서 실험 한 적 이 있다.이 배열 이 69(64 비트 CPU 에서)가 아니라면 프로그램 crach 를 직접 초래 할 것 이다!
       fpc 지문 채취 흐름 도:

       원본 코드 는 다음 과 같 습 니 다.
       FingerPrintEnrollBase:
자바 코드

/* 
 * Copyright (C) 2015 The Android Open Source Project 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *  http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License 
 */ 
 
package com.mediatek.test; 
 
import android.app.Activity; 
import android.app.Fragment; 
import android.content.Context; 
import android.hardware.fingerprint.FingerprintManager; 
import android.os.Bundle; 
import android.os.CancellationSignal; 
import android.os.Handler; 
import android.util.Log; 
/** 
 * local fragment to handle the state around fingerprint enrollment. 
 */ 
public class FingerPrintEnrollBase extends Fragment { 
 
 private int mEnrollmentSteps = -1; 
 private int mEnrollmentRemaining = 0; 
 private Listener mListener; 
 private boolean mEnrolling; 
 private CancellationSignal mEnrollmentCancel; 
 private Handler mHandler = new Handler(); 
 private byte[] mToken = new byte[69];//if byte length != sizeof(hw_auth_token_t), throws Exception 
 private boolean mDone; 
 private static final String TAG = "FingerPrintEnrollBase"; 
 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setRetainInstance(true); 
 } 
 
 @Override 
 public void onAttach(Activity activity) { 
  super.onAttach(activity); 
 } 
 
 @Override 
 public void onStart() { 
  super.onStart(); 
  Log.d(TAG, "mToken length="+mToken.length); 
  if (!mEnrolling) { 
   FingerprintManager mFpM = (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE); 
   startEnrollment(mFpM); 
  } 
 } 
 
 @Override 
 public void onStop() { 
  super.onStop(); 
  if (!getActivity().isChangingConfigurations()) { 
   cancelEnrollment(); 
  } 
 } 
 
 protected void startEnrollment(FingerprintManager mFpM) { 
  mHandler.removeCallbacks(mTimeoutRunnable); 
  mEnrollmentSteps = -1; 
  mEnrollmentCancel = new CancellationSignal(); 
  if(mFpM != null){ 
   mFpM.enroll(mToken, mEnrollmentCancel, 0, mEnrollmentCallback); 
  } 
  mEnrolling = true; 
 } 
 
 protected void cancelEnrollment() { 
  mHandler.removeCallbacks(mTimeoutRunnable); 
  if (mEnrolling) { 
   mEnrollmentCancel.cancel(); 
   mEnrolling = false; 
   mEnrollmentSteps = -1; 
  } 
 } 
 
 public void setListener(Listener listener) { 
  mListener = listener; 
 } 
 
 public int getEnrollmentSteps() { 
  return mEnrollmentSteps; 
 } 
 
 public int getEnrollmentRemaining() { 
  return mEnrollmentRemaining; 
 } 
 
 public boolean isDone() { 
  return mDone; 
 } 
 
 private FingerprintManager.EnrollmentCallback mEnrollmentCallback 
   = new FingerprintManager.EnrollmentCallback() { 
 
  @Override 
  public void onEnrollmentProgress(int remaining) { 
   if (mEnrollmentSteps == -1) { 
    mEnrollmentSteps = remaining; 
   } 
   mEnrollmentRemaining = remaining; 
   mDone = remaining == 0; 
   if (mListener != null) { 
    mListener.onEnrollmentProgressChange(mEnrollmentSteps, remaining); 
   } 
  } 
 
  @Override 
  public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) { 
   if (mListener != null) { 
    mListener.onEnrollmentHelp(helpString); 
   } 
  } 
 
  @Override 
  public void onEnrollmentError(int errMsgId, CharSequence errString) { 
   if (mListener != null) { 
    mListener.onEnrollmentError(errMsgId, errString); 
   } 
  } 
 }; 
 
 private final Runnable mTimeoutRunnable = new Runnable() { 
  @Override 
  public void run() { 
   cancelEnrollment(); 
  } 
 }; 
 
 public interface Listener { 
  void onEnrollmentHelp(CharSequence helpString); 
  void onEnrollmentError(int errMsgId, CharSequence errString); 
  void onEnrollmentProgressChange(int steps, int remaining); 
 } 
} 
       FingerPrintActivity:
자바 코드

package com.mediatek.test; 
 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.List; 
import java.util.Timer; 
import java.util.TimerTask; 
 
import android.R.color; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.os.CancellationSignal; 
import android.os.Handler; 
import android.os.Message; 
import android.text.Spannable; 
import android.text.style.ForegroundColorSpan; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 
import android.widget.TableRow; 
import android.widget.TextView; 
import android.widget.Toast; 
 
import com.mediatek.test.R; 
import android.hardware.fingerprint.Fingerprint; 
import android.hardware.fingerprint.FingerprintManager; 
 
public class FingerPrintActivity extends Activity implements FingerPrintEnrollBase.Listener{ 
 private static final String TAG = "FingerPrintActivity"; 
 private MyHandler mHandler = new MyHandler(); 
 private TextView fingerPrintAcquisitionTextView, fingerPrintEnrollmentErrorView, fingerPrintEnrollmentHelpView; 
 private FingerPrintEnrollBase fpeb; 
 private FingerprintManager mFingerprintManager; 
  
 @Override 
 protected int setTitleId() { 
  return R.string.tittle_fingerprint; 
 } 
 
 @Override 
 protected Activity getActivity() { 
  return this; 
 } 
  
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.fingerprint); 
  fingerPrintAcquisitionTextView = (TextView)findViewById(R.id.fingerprint_message); 
  fingerPrintEnrollmentErrorView= (TextView)findViewById(R.id.fingerprint_enrollment_error); 
  fingerPrintEnrollmentHelpView= (TextView)findViewById(R.id.fingerprint_enrollment_help); 
 
  mFingerprintManager = (FingerprintManager) getActivity().getSystemService( 
    Context.FINGERPRINT_SERVICE); 
   
    
 } 
  
 private void sendMsgToHandler(int msgType, String remark){ 
  Message msg = Message.obtain(); 
  msg.what = msgType; 
  Bundle bundle = new Bundle(); 
  bundle.putString("result", remark); 
  msg.setData(bundle); 
  mHandler.sendMessage(msg); 
 } 
  
 @Override 
 public void onEnrollmentHelp(CharSequence helpString) { 
  Log.d(TAG, "==onEnrollmentHelp="+helpString.toString()); 
  sendMsgToHandler(3, helpString.toString()); 
 } 
 
 @Override 
 public void onEnrollmentError(int errMsgId, CharSequence errString) { 
  Log.d(TAG, "==onEnrollmentError errMsgId="+errMsgId+" errString="+errString.toString()); 
  if(errMsgId == 3){//time out 
   postEnrollment(); 
  }else if(errMsgId == 1){//hardware lose efficacy 
   startEnrollment(); 
  }else if(errMsgId == 5){//operation cancel 
  }else{ 
   sendMsgToHandler(4, errString.toString()); 
  } 
 } 
 
 @Override 
 public void onEnrollmentProgressChange(int steps, int remaining) { 
  Log.d(TAG, "===============onEnrollmentProgressChange======="); 
  Log.d(TAG, "steps" + steps + "||remaining=" + remaining); 
  fingerPrintEnrollmentHelpView.setText(""); 
  fingerPrintEnrollmentErrorView.setText(""); 
  sendMsgToHandler(2, getString(R.string.fingerprint_validate_success)); 
  buttonS.setEnabled(true); 
  stopFingerprint(); 
 } 
  
 private void startEnrollment(){ 
  if (fpeb == null) { 
   fpeb = new FingerPrintEnrollBase(); 
  } 
  fpeb.setListener(this); 
  fpeb.startEnrollment(mFingerprintManager); 
 } 
 private void postEnrollment(){ 
  if(mFingerprintManager != null){ 
   mFingerprintManager.postEnroll(); 
  } 
 } 
  
 private void stopFingerprint() { 
  if (fpeb != null){ 
   fpeb.cancelEnrollment(); 
   onStop(); 
  } 
 } 
  
 @Override 
 protected void onStart() { 
  super.onStart(); 
 } 
  
 @Override 
 protected void onStop() { 
  super.onStop(); 
  if(fpeb != null){ 
   fpeb.setListener(null); 
  } 
 } 
 
 @Override 
 protected void onResume() { 
  super.onResume(); 
  if(mFingerprintManager == null){ 
   mFingerprintManager = (FingerprintManager) getActivity().getSystemService( 
    Context.FINGERPRINT_SERVICE); 
  } 
   
  startEnrollment(); 
 } 
  
 @Override 
 protected void onPause() { 
  super.onPause(); 
  postEnrollment(); 
  mFingerprintManager = null; 
  stopFingerprint(); 
  fpeb = null; 
 } 
 
  
 class MyHandler extends Handler{ 
 
  @Override 
  public void handleMessage(Message msg) { 
   Bundle bundle = null; 
   super.handleMessage(msg); 
   switch (msg.what) { 
   case 0: 
    removeMessages(0); 
    bundle = msg.getData(); 
    String result = bundle.getString("result"); 
    selfTestView.setText(result); 
    selfTestView.setTextColor(result.contains("PASS")?Color.GREEN:Color.RED); 
    break; 
   case 1: 
    removeMessages(1); 
    bundle = msg.getData(); 
    String rs = bundle.getString("result"); 
    checkBroadView.setText(bundle.getString("result")); 
    checkBroadView.setTextColor(rs.contains("PASS")?Color.GREEN:Color.RED); 
    break; 
   case 2: 
    removeMessages(2); 
    bundle = msg.getData(); 
    String fingerprint = bundle.getString("result"); 
    fingerPrintAcquisitionTextView.setText(bundle.getString("result")); 
    fingerPrintAcquisitionTextView.setTextColor(fingerprint.contains("PASS")?Color.GREEN:Color.WHITE); 
    mButtonSelftest.setEnabled(true); 
    mButtonCheckerboardTest.setEnabled(true); 
    break; 
   case 3: 
    removeMessages(3); 
    bundle = msg.getData(); 
    String enrollmentHelp = bundle.getString("result"); 
    fingerPrintEnrollmentHelpView.setText(bundle.getString("result")); 
    break; 
   case 4: 
    removeMessages(4); 
    bundle = msg.getData(); 
    String enrollmentError = bundle.getString("result"); 
    fingerPrintEnrollmentErrorView.setText(bundle.getString("result")); 
    fingerPrintAcquisitionTextView.setText(""); 
    break; 
   default: 
    break; 
   } 
  } 
 } 
 
} 
이상 은 안 드 로 이 드 지문 자료 에 대한 정리 입 니 다.추 후 관련 자 료 를 계속 보충 하 겠 습 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기